﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace ProyectoFinal
{
    
            
    public partial class Facturar : Form
    {
        DataSet Temp;
        bool inicio = false;
        bool listacargada = false;
        DataSet BaseProductos;
        DataSet TablasBusquedas;
        DataSet BaseVentas;
        DataSet BaseEmpleados;
        DataSet Clientes;
         
        string rutaSQL = "Data Source=localhost;Initial Catalog=Isotopos;Integrated Security=True;";

        public Facturar()
        {
            InitializeComponent();
            BaseEmpleados = new DataSet();
            BaseVentas = new DataSet();
            TablasBusquedas = new DataSet();
            BaseProductos = new DataSet();
            Temp = new DataSet();
            Clientes = new DataSet();
            cargar_categorias();
            
            inicio = true;
            timer1.Start();
            set_fecha();
            cargar_ventas_abiertas();
            prod_nombre.SelectedIndex = 0;
            cargar_empleados();
            cargar_mesas();
            llenar_cbApellidosNombre_clientes();
        }

        public void cargar_categorias()
        {
            string QuerySQL = "Select * from Productos";
            SqlConnection cn = new SqlConnection(rutaSQL);
            SqlDataAdapter adaptador = new SqlDataAdapter(QuerySQL, cn);
            cn.Open();
            adaptador.Fill(BaseProductos, "Productos");
            cn.Close();
            prod_nombre.DataSource = BaseProductos.Tables["Productos"];
            prod_nombre.ValueMember = "IdProducto";            
            prod_nombre.DisplayMember = "NombreProducto";
            prod_nombre.SelectedIndex = 1;
        }

        public void cargar_ticket(string cat)
        {
            //string QuerySQL = "Select Distinct NombreMesa,Nombre,Apellido,Estado,Precio, IdVenta from Ventas Inner Join Mesas on IdMesa=Mesa  Inner Join Empleados on IdEmpleado=IdEmpleadoVendedor where IdVenta=" + cat;
            //string QuerySQL = "Select Distinct Ventas.IdProducto,NombreProducto,NombreMesa,Nombre,Apellidos,Estado,Precio, IdVenta from Ventas Inner Join Mesas on IdMesa=Mesa  Inner Join Empleados on IdEmpleado=IdEmpleadoVendedor  Inner Join Productos on Ventas.IdProducto=Productos.IdProducto where IdVenta=" + cat;

            string QuerySQL = "Select Distinct ProductosxVenta.IdProducto, Cant, NombreProducto,NombreMesa,Nombre,Apellidos,Estado,Precio, IdVenta from Ventas Inner Join ProductosxVenta on CodVenta=IdVenta Inner Join Mesas on IdMesa=Mesa  Inner Join Empleados on IdEmpleado=IdEmpleadoVendedor  Inner Join Productos on ProductosxVenta.IdProducto=Productos.IdProducto where IdVenta=" + cat;
            
            SqlConnection con = new SqlConnection(rutaSQL);
            SqlCommand cmd = new SqlCommand(QuerySQL);

            //SqlDataAdapter adaptador = new SqlDataAdapter(QuerySQL, con);
            //adaptador.Fill(precio_prod., "Productos");

            DataTable tabla = new DataTable(); // El resultado lo guardaremos en una tabla
            SqlDataAdapter AdaptadorTabla = new SqlDataAdapter(QuerySQL, con); // Usaremos un DataAdapter para leer los datos
            //DataSet ds = new DataSet();
            AdaptadorTabla.Fill(tabla);// Llenamos la tabla con los datos leídos
           
            int cant = tabla.Rows.Count;
            lbl_tiknum.Text =cat;
            try
            {
                string empleado = tabla.Rows[0]["Nombre"].ToString() + " " + tabla.Rows[0]["Apellidos"].ToString();
                lbl_empleado.Text = empleado;

                dataGridView1.Rows.Clear();

                float total_factura = 0;
                float precio, canti, total;
                string nombre, idProd;
                for (int m = 0; m < cant; m++)
                {
                    //nombre,cantidad,precio,total,idprod 
                    canti = float.Parse(tabla.Rows[m]["Cant"].ToString());
                    precio = float.Parse(tabla.Rows[m]["Precio"].ToString());
                    total = canti * precio;
                    nombre = tabla.Rows[m]["NombreProducto"].ToString();
                    idProd = tabla.Rows[m]["IdProducto"].ToString();
                    dataGridView1.Rows.Add(nombre, canti, precio, total, idProd);
                    total_factura += total;
                }

                lbl_total.Text = total_factura.ToString();
               // lbl_tiknum.Text = tabla.Rows[0]["IdVenta"].ToString();
            }
            catch (Exception)
            {
                return;//no haga nada
            }
        }

        public void cargar_precio(string cat)
        {
            prod_precio.Text = "";           
            string QuerySQL = "Select PrecioUnidad,IdProducto from Productos where IdProducto=" + cat + "";
           
              SqlConnection con = new SqlConnection(rutaSQL);           
              SqlCommand cmd = new SqlCommand(QuerySQL);
               
              //SqlDataAdapter adaptador = new SqlDataAdapter(QuerySQL, con);
              //adaptador.Fill(precio_prod., "Productos");
            
              DataTable tabla = new DataTable(); // El resultado lo guardaremos en una tabla
              SqlDataAdapter AdaptadorTabla = new SqlDataAdapter(QuerySQL, con); // Usaremos un DataAdapter para leer los datos
              //DataSet ds = new DataSet();
              AdaptadorTabla.Fill(tabla);// Llenamos la tabla con los datos leídos

              prod_precio.Text = tabla.Rows[0]["PrecioUnidad"].ToString();
              prod_codigo.Text = tabla.Rows[0]["IdProducto"].ToString();
        }

        public void cargar_ventas_abiertas()
        {
            //La lista de mesas que se estan usando.
            //Para agregarle algun producto a una mesa ya abierta.:

            string QuerySQL = "Select Distinct NombreMesa,IdVenta from Ventas Inner Join Mesas on IdMesa=Mesa where estado=1";
            //   string QuerySQL = "SELECT DISTINCT IdVenta, from Ventas where estado=1";
            SqlConnection cn = new SqlConnection(rutaSQL);
            SqlDataAdapter adaptador = new SqlDataAdapter(QuerySQL, cn);
            cn.Open();
            adaptador.Fill(BaseVentas, "Ventas");
            cn.Close();
            
            lb_listaventas.DataSource = BaseVentas.Tables["Ventas"];
            lb_listaventas.ValueMember = "IdVenta";
            lb_listaventas.DisplayMember = "NombreMesa";
            lb_listaventas.SelectedIndex = 0;
            listacargada = true;
        }

        public void cargar_mesas()
        {
            string QuerySQL = "Select * from Mesas";
            SqlConnection cn = new SqlConnection(rutaSQL);
            SqlDataAdapter adaptador = new SqlDataAdapter(QuerySQL, cn);
            cn.Open();
            adaptador.Fill(BaseEmpleados, "Mesas");
            cn.Close();
            cb_mesas2.DataSource = BaseEmpleados.Tables["Mesas"];
            cb_mesas2.ValueMember = "IdMesa";
            cb_mesas2.DisplayMember = "NombreMesa";
        }



        private void AgregarTablaDataSetSQLServer(string ConexionBD, string ConsultaSQL,
                                  string NombreTabla, ref DataSet ds)
        {
            SqlConnection cn = new SqlConnection(ConexionBD);
            SqlDataAdapter adaptador = new SqlDataAdapter(ConsultaSQL, cn);
            cn.Open();
            adaptador.Fill(ds, NombreTabla);
        }

        private void llenar_cbApellidosNombre_clientes()
        {
            string ConsultaSQLApellidosNombre = "Select Cif_Nif_Dni,(Apellidos + \', \' + Nombre) as Name_Full FROM Clientes order by Apellidos";
  
            AgregarTablaDataSetSQLServer(rutaSQL, ConsultaSQLApellidosNombre, "Clientes", ref Clientes);

            cbClientes.DataSource = Clientes.Tables[0].DefaultView;
            cbClientes.ValueMember = "Cif_Nif_Dni";
            cbClientes.DisplayMember = "Name_Full";

        }

        public void cargar_empleados()
        {
            string QuerySQL = "Select *,Nombre + ' ' + Apellidos as NAM from Empleados"; 
            SqlConnection cn = new SqlConnection(rutaSQL);
            SqlDataAdapter adaptador = new SqlDataAdapter(QuerySQL, cn);
            cn.Open();
            adaptador.Fill(BaseEmpleados, "emp");
            cn.Close();
            cb_empleados2.DataSource = BaseEmpleados.Tables["emp"];
            cb_empleados2.ValueMember = "IdEmpleado";
            cb_empleados2.DisplayMember = "NAM";
        }

        private void cb_cat1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(inicio) cargar_precio(prod_nombre.SelectedValue.ToString());
        }

        private void Facturar_Load(object sender, EventArgs e)
        {
            lbl_nuevonum.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int haystock = get_stock(prod_codigo.Text);
            int nito  = Int32.Parse(prod_cant.Text);
            if ((haystock <= 0) | (nito>haystock))
            {

               
                
                MessageBox.Show("No hay stock suficiente de ese articulo. Hay " + haystock + " y necesito " + nito + " unidades.");
                return;

            };
           


            if (prod_nombre.SelectedIndex >= 0)
            {
                string a = prod_precio.Text;
                if (a == "") { MessageBox.Show("Seleccione un Producto"); return; }
                float total = float.Parse(a) * float.Parse(prod_cant.Text);

                string prize = (float.Parse(prod_precio.Text) * 1).ToString();
                dataGridView1.Rows.Add(prod_nombre.Text, prod_cant.Text, prize, total, prod_codigo.Text);

                lbl_total.Text = (float.Parse(lbl_total.Text.Replace("$","")) + total).ToString() + " $";

                string s = ", ";
                //crearVenta
                string dt = DateTime.Now.ToString("yyyyMMdd");

                //si existe IdVenta,IdEmpleadoVendedor,Estado,Mesa,FechaVenta,Total
                string emp= cb_empleados2.SelectedValue.ToString();
                string mes = cb_mesas2.SelectedValue.ToString();
                dt = "'" + dt + "'"; 
                string stringvalores = lbl_tiknum.Text + s + emp + s + "1" + s + mes + s + dt + s + "0";
                string QuerySQL2 = "IF EXISTS (SELECT * FROM Ventas where IdVenta="+lbl_tiknum.Text+") Select 1 else Insert Into Ventas (IdVenta,IdEmpleadoVendedor,Estado,Mesa,FechaVenta,Total) VALUES(" + stringvalores + ")";


                //codventa idproducto precio cant
              //  string QuerySQL = "Insert Into ProductosxVenta (CodVenta,IdProducto,Precio,Cant) VALUES("+lbl_tiknum.Text.ToString()+","+prod_codigo.Text.ToString()+",'"+prize+"',"+prod_cant.Text.ToString()+")";
                string QuerySQL = "InsertarProdaVenta " + lbl_tiknum.Text.ToString() + "," + prod_codigo.Text.ToString() + ",'" + prize + "'," + prod_cant.Text.ToString();
                SqlConnection con = new SqlConnection(rutaSQL);
                SqlCommand cmdInsert = con.CreateCommand();
                SqlCommand cmdInsert2 = con.CreateCommand();

                cmdInsert.CommandText = QuerySQL;
                cmdInsert2.CommandText = QuerySQL2;

                con.Open();
                cmdInsert2.ExecuteNonQuery();
                cmdInsert.ExecuteNonQuery();
                

                con.Close();

                listacargada = false;

                actualizar_lista_ventas();
                cargar_ticket(lbl_tiknum.Text);
            }
            else
            {
                MessageBox.Show("Elija un Producto");
            }

        }


        public void actualizar_lista_ventas(){
                 BaseVentas.Tables["Ventas"].Clear();//para actualizarla.      
                cargar_ventas_abiertas();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
            string QuerySQL = "Select NombreProducto from Productos where IdProducto=" + prod_cod.Text + "";
            SqlConnection con = new SqlConnection(rutaSQL);
            SqlCommand cmd = new SqlCommand(QuerySQL);
            DataTable tabla = new DataTable(); 
            SqlDataAdapter AdaptadorTabla = new SqlDataAdapter(QuerySQL, con); 
            AdaptadorTabla.Fill(tabla);// Llenamos la tabla con los datos leídos
            prod_nombre.Text = tabla.Rows[0]["NombreProducto"].ToString();
            //.Text = tabla.Rows[0]["NombreProducto"].ToString();
            }
            catch
            {
                MessageBox.Show("No se encontro ese Producto. Asegurese de Ingresar un Codigo Existente");
            }
        }

        private void prod_cod_KeyDown(object sender, KeyEventArgs e)
        {
            {
                if (e.KeyCode == Keys.Enter)
                    button2_Click(sender, e);
            }
        }


        public void set_fecha(){
            lbl_fecha.Text = DateTime.Now.ToString("MM/dd/yyyy h:mm tt");
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            set_fecha();
            
        }

        private void lb_listaventas_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listacargada)
            {
                try
                {
                    dataGridView1.Rows.Clear();
                    cargar_ticket(lb_listaventas.SelectedValue.ToString());
                    agregar_prod.Enabled = true;
                }
                catch (Exception)
                {
                   
                    return;
                }
            }
           // if (listacargada) cargar_ticket("5001");
        }


        int get_stock(string id_prod)
        {

            string QuerySQL = "select UnidadesEnExistencia from Productos where IdProducto=" + id_prod;
            SqlConnection con = new SqlConnection(rutaSQL);
            SqlCommand cmd = new SqlCommand(QuerySQL);
            DataTable tabla = new DataTable(); // El resultado lo guardaremos en una tabla
            SqlDataAdapter AdaptadorTabla = new SqlDataAdapter(QuerySQL, con); // Usaremos un DataAdapter para leer los datos
            AdaptadorTabla.Fill(tabla);// Llenamos la tabla con los datos leídos
            return Int32.Parse(tabla.Rows[0]["UnidadesEnExistencia"].ToString());
        }

        int restar_cantidad(string id_prod, string cant)
        {

            try
            {
                string QuerySQL = "Update Productos Set UnidadesEnExistencia=UnidadesEnExistencia-" + cant + " where IdProducto=" + id_prod;
                SqlConnection con = new SqlConnection(rutaSQL);
                SqlCommand cmdInsert = con.CreateCommand();
                cmdInsert.CommandText = QuerySQL;
                con.Open();
                cmdInsert.ExecuteNonQuery();
                con.Close();
                return 0;
            }
            catch (Exception)
            {
                MessageBox.Show("No hay stock suficiente de producto " + id_prod);
                return 1;
            }
        }
        private void btn_nuevotik_Click(object sender, EventArgs e)
        {
            string QuerySQL = "Select (Max(IdVenta)+1) as Last from Ventas";//ultimaventa +1
            SqlConnection con = new SqlConnection(rutaSQL);
            SqlCommand cmd = new SqlCommand(QuerySQL);
            DataTable tabla = new DataTable(); 
            SqlDataAdapter AdaptadorTabla = new SqlDataAdapter(QuerySQL, con); 
            AdaptadorTabla.Fill(tabla);// Llenamos la tabla con los datos leídos        
            lbl_tiknum.Text = tabla.Rows[0]["Last"].ToString();
            lbl_nuevonum.Text = tabla.Rows[0]["Last"].ToString();
            dataGridView1.Rows.Clear();
            agregar_prod.Enabled = true;
        }

        private void cb_empleados2_SelectedIndexChanged(object sender, EventArgs e)
        {

        }



        
         public void ejecutar_consulta(string consulta){
                SqlConnection con2 = new SqlConnection(rutaSQL);
                SqlCommand cmdInsert2 = con2.CreateCommand();
                cmdInsert2.CommandText = consulta;
                con2.Open();
                cmdInsert2.ExecuteNonQuery();
                con2.Close();

         }

        private void button3_Click(object sender, EventArgs e)
        {

         
            for (int m=0;m<dataGridView1.Rows.Count;m++) {

                string cant = dataGridView1.Rows[m].Cells[1].Value.ToString();
                string id = dataGridView1.Rows[m].Cells[4].Value.ToString();

                if (restar_cantidad(id, cant) == 1)
                {
                    return;

                };
                //restamos cantidades del stock de esos produtos antes de cerrar el ticket

            }



                string dt = DateTime.Now.ToString("yyyyMMdd");  

            if (cb_cta_cte.Checked == true)
            {
                MessageBox.Show("Agregado a la cta. corriente del cliente: " + cbClientes.Text.ToString());
                ejecutar_consulta("Insert Into ClientesVentas (DniCliente,IdVenta) VALUES('" + cbClientes.SelectedValue.ToString() + "','" + lbl_tiknum.Text + "')");
                ejecutar_consulta("Insert Into ClientesDeuda (DniCliente,Monto,Fecha) VALUES ('" + cbClientes.SelectedValue.ToString() + "','" + lbl_total.Text + "','" + dt + "')");
            }
            
            //codventa idproducto precio cant
            //estado=0 ---> le cobraron al cliente
   
            string nuevototal = lbl_total.Text.Replace(" $", "").Replace(",", ".");
            string id_venta = lbl_tiknum.Text;
            string QuerySQL = "Update Ventas Set Estado=0,Total='"+nuevototal+"' where IdVenta="+id_venta ;
            SqlConnection con = new SqlConnection(rutaSQL);
            SqlCommand cmdInsert = con.CreateCommand();
            cmdInsert.CommandText = QuerySQL;
            con.Open();
            cmdInsert.ExecuteNonQuery();
            con.Close();

            actualizar_lista_ventas();
            cb_cta_cte.Checked = false;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                string id_venta = lbl_tiknum.Text;
                string QuerySQL = "DELETE FROM ProductosxVenta WHERE CodVenta=" + id_venta;
                string QuerySQL2 = "DELETE FROM Ventas WHERE IdVenta=" + id_venta;

                SqlConnection con = new SqlConnection(rutaSQL);

                SqlCommand cmdInsert = con.CreateCommand();
                cmdInsert.CommandText = QuerySQL;

                SqlCommand cmdInsert2 = con.CreateCommand();
                cmdInsert2.CommandText = QuerySQL2;

                con.Open();
                cmdInsert.ExecuteNonQuery();
                cmdInsert2.ExecuteNonQuery();
                con.Close();

                actualizar_lista_ventas();
            }
            catch (Exception)
            {
                MessageBox.Show("Borrado");
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            //ventas
            Form6 abrirformulario = new Form6(1);
            abrirformulario.ShowDialog(); 
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button7_Click(object sender, EventArgs e)
        {

            try
            {

                string n;
                n = Inputbox.Show("Calcular Vuelto", "Con cuanto abonaron? - Usar comas para monedas. ", FormStartPosition.CenterScreen);

                float pagagocon = float.Parse(n);
                float hayqpagar = float.Parse(lbl_total.Text.ToString());

                if (hayqpagar > pagagocon)
                {
                    MessageBox.Show("Pago con menos cantidad de lo necesario!");
                }
                else
                {
                    pvuelto.Visible = true;
                    float vuelto = pagagocon - hayqpagar;
                    lbl_abono.Text = pagagocon.ToString();
                    lbl_vuelto.Text = vuelto.ToString();

                }

            }
            catch (Exception)
            {
                return;
            }


        }

        private void prod_cod_TextChanged(object sender, EventArgs e)
        {


            if (prod_cod.Text != "")
            {
                try
                {
                    string QuerySQL = "Select NombreProducto from Productos where IdProducto=" + prod_cod.Text + "";
                    SqlConnection con = new SqlConnection(rutaSQL);
                    SqlCommand cmd = new SqlCommand(QuerySQL);
                    DataTable tabla = new DataTable();
                    SqlDataAdapter AdaptadorTabla = new SqlDataAdapter(QuerySQL, con);
                    AdaptadorTabla.Fill(tabla);// Llenamos la tabla con los datos leídos
                    prod_nombre.Text = tabla.Rows[0]["NombreProducto"].ToString();
                    //.Text = tabla.Rows[0]["NombreProducto"].ToString();
                }
                catch
                {
                    MessageBox.Show("No se encontro ese Producto. Asegurese de Ingresar un Codigo Existente");
                }
            }
        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void ayudaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Este formulario se usa para ingresar ventas, los articulos que corresponden a cada venta y posteriormente, para cerrar el ticket, cobrar y agregarlo a las ventas realizadas");
        }

        private void cb_cta_cte_CheckedChanged(object sender, EventArgs e)
        {
            lbl_cta_cte.Enabled = cb_cta_cte.Checked;
            panel_cta_cte.Enabled = cb_cta_cte.Checked;
            lbl_help1.Enabled = cb_cta_cte.Checked;
          

        }

        private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
        
            string mn = dataGridView1.SelectedRows[0].Index.ToString();
            string z = dataGridView1.Rows[Int16.Parse(mn)].Cells[0].Value.ToString();//nombre
            string id = dataGridView1.Rows[Int16.Parse(mn)].Cells[4].Value.ToString();//nombre
            string tik = lbl_tiknum.Text;

               if (MessageBox.Show("¿Eliminar este Producto ("+z+") del Ticket?", "Confirmar Cambios.", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
               ejecutar_consulta("Delete from ProductosxVenta where CodVenta="+tik+" and IdProducto="+id);
               cargar_ticket(tik);
            }


        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

     
    }
}
